wayland: Maybe postpone xdg-foreign state setup until mapping
authorJonas Ådahl <jadahl@gmail.com>
Fri, 1 Dec 2017 04:18:30 +0000 (12:18 +0800)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 8 Dec 2017 03:13:39 +0000 (22:13 -0500)
In order to map a window with the correct initial parent-child
relationship when a modal dialog is set up to be a child of an imported
foreign window, the relationship must be set up before the window is
mapped.

In order to do this, if a window is not yet mapped, postpone the
relationship setup until when the window is eventually mapped.

https://bugzilla.gnome.org/show_bug.cgi?id=791062

gdk/wayland/gdkwindow-wayland.c

index bc1a9d0bdd865248f82c0260954c181a277f7e8f..0429ee5f54b8b9823c9bee5812b90fa6f91b5eb6 100644 (file)
@@ -1086,6 +1086,24 @@ gdk_wayland_window_sync_parent (GdkWindow *window,
                                parent_toplevel);
 }
 
+static void
+gdk_wayland_window_sync_parent_of_imported (GdkWindow *window)
+{
+  GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
+  if (!impl->display_server.wl_surface)
+    return;
+
+  if (!impl->imported_transient_for)
+    return;
+
+  if (!impl->display_server.xdg_toplevel)
+    return;
+
+  zxdg_imported_v1_set_parent_of (impl->imported_transient_for,
+                                  impl->display_server.wl_surface);
+}
+
 static void
 gdk_wayland_window_update_dialogs (GdkWindow *window)
 {
@@ -1542,6 +1560,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
                                  window);
 
   gdk_wayland_window_sync_parent (window, NULL);
+  gdk_wayland_window_sync_parent_of_imported (window);
   gdk_wayland_window_sync_title (window);
 
   if (window->state & GDK_WINDOW_STATE_MAXIMIZED)
@@ -4361,12 +4380,12 @@ gdk_wayland_window_set_transient_for_exported (GdkWindow *window,
 
   g_return_val_if_fail (GDK_IS_WAYLAND_WINDOW (window), FALSE);
   g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
+  g_return_val_if_fail (!should_map_as_subsurface (window) &&
+                        !should_map_as_popup (window), FALSE);
 
   impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
   display_wayland = GDK_WAYLAND_DISPLAY (display);
 
-  g_return_val_if_fail (impl->display_server.xdg_surface, FALSE);
-
   if (!display_wayland->xdg_importer)
     {
       g_warning ("Server is missing xdg_foreign support");
@@ -4381,8 +4400,7 @@ gdk_wayland_window_set_transient_for_exported (GdkWindow *window,
                                  &xdg_imported_listener,
                                  window);
 
-  zxdg_imported_v1_set_parent_of (impl->imported_transient_for,
-                                  impl->display_server.wl_surface);
+  gdk_wayland_window_sync_parent_of_imported (window);
 
   return TRUE;
 }